12wk-1: 마코프체인 (10)
2023-05-18
강의영상
youtube: https://youtube.com/playlist?list=PLQqh36zP38-w6PeAXdc4YcGTb7M_67Wog
imports
지난시간
-
수학: 어떠한 집합
단 여기에서
-
통계: 확률변수열
단 여기에서
-
의미(
- IRR 하지 않은 마코프체인은 IRR 한 마코프체인으로 분해하여 생각할 수 있다.
- 앞으로 마코프체인에 대한 성질을 연구할때 IRR 은 그냥 가정해도 무방하다.
-
예시1: 아래와 같은 전이행렬을 고려하자.
해석1: 모든 분포가 정상분포라고 해석
해석2: 전체마코프체인을 쪼개서 (1) 상태0에만 머무는 마코프체인, (2) 상태1에만 머무는 마코프체인으로 나누어 생각하고 각각에 대한 정상분포가 1이라고 해석.
-
예시2: 아래와 같은 전이행렬을 고려하자.
array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 0, 1],
[0, 0, 1, 0]])
해석: 전체마코프체인을 쪼개서 (1) 상태0에만 머무는 마코프체인, (2) 상태1에만 머무는 마코프체인 (3) 상태 2,3을 셔플하는 마코프체인으로 생각하자. 즉 상태공간을 아래와 같이 분리하자.
각 상태공간에 대응하는 마코프체인의 정상분포를
단, 여기에서
예비학습
나그네
-
나그네 (박목월)
강나루 건너서
밀밭 길을
구름에 달 가듯이
가는 나그네
길은 외줄기
南道 삼백리
술 익는 마을마다
타는 저녁놀
구름에 달 가듯이
가는 나그네
-
나그네
- 정착 X
- 모든 장소에 일시적(transient)으로만 머뭄
- 다시 돌아올 수는 있는데 금방 다시 감.
-
편의상 아래와 같이 생각하자.
: 마을의 집합 : 시점에 나그네가 마을 에 머무는 event
급수의 수렴
-
-
예시1:
-
예시2:
nature
예제1: 오른쪽으로만 갈래
확률변수열
-
체크: 이 예제의 마코프체인은 IRR 하지 않다.
-
나이스케이스:
-
이 예제는 나이스하지 않음 왜? IRR이 아니라서?
- IRR이 아니라서 나이스하지 않다는 것은 핑계임.
- 오른쪽으로 갈 확률을 0.99로 수정한다면 IRR 마코프체인이 된다. 그렇지만 이게 나이스하게 바뀔 것 같지는 않음.
-
나이스하지 않은 본질적인 이유
- 상태
에 일시적(transient)으로 머무는 느낌. 거의 나그네 수준임. 이와 같은 논리전개를 쓰려면 일단 가 특정상태를 무한번 방문해야 가능
-
FINITE case
- IRR은 가정할 수 있음.
- IRR을 가정한다면, 모든 마을에 대해서 나그네가 반복적으로 돌아오는 느낌이 있음.
-
깨달음.
- FINITE 인 경우는 IRR 이기만 하면 “반복적으로 마을방문” 이 보장되었다.
- 그런데 INFINITE 한 경우는 IRR 이어도 “반복적으로 마을방문” 이 보장되지 않는다.
IRR 조건이 엄청 대단한 조건인줄 알았는데, 사실 그런게 아니고 (수틀리면 그냥 IRR 이라고 가정해도 무방한) 실제로 대단한 조건은 숨어있는 “반복적으로 마을방문” 이라는 조건임.
-
가짜정의: HMC
Reccurent, Transient
-
대안정의:
예제2: reflecting random walk
확률변수열
-
체크: 이 마코프체인은 IRR하다.
-
case1:
p=0.99
P1 = np.array([[i-j == 1 for i in range(1000)] for j in range(1000)])*p
P2 = np.array([[j-i == 1 for i in range(1000)] for j in range(1000)])*(1-p)
P = P1+P2
P[0,0]= 1-p
P
array([[0.01, 0.99, 0. , ..., 0. , 0. , 0. ],
[0.01, 0. , 0.99, ..., 0. , 0. , 0. ],
[0. , 0.01, 0. , ..., 0. , 0. , 0. ],
...,
[0. , 0. , 0. , ..., 0. , 0.99, 0. ],
[0. , 0. , 0. , ..., 0.01, 0. , 0.99],
[0. , 0. , 0. , ..., 0. , 0.01, 0. ]])
array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]])
array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]])
관찰결과
. 이라고 해서 이라고 주장할 순 없음. 역시 주장할 수 없음. 이 0으로 수렴하는 속도가 매우 빠르다면 일 것이고 그렇지 않다면 일 것임.- 이 경우는
이 빠르게 0으로 수렴하는듯 보이므로 왠지 일 것으로 예상가능 - 상태0은 transient 인 듯 하다. (확신 X)
-
case2:
p=0.1
P1 = np.array([[i-j == 1 for i in range(1000)] for j in range(1000)])*p
P2 = np.array([[j-i == 1 for i in range(1000)] for j in range(1000)])*(1-p)
P = P1+P2
P[0,0]= 1-p
P
array([[0.9, 0.1, 0. , ..., 0. , 0. , 0. ],
[0.9, 0. , 0.1, ..., 0. , 0. , 0. ],
[0. , 0.9, 0. , ..., 0. , 0. , 0. ],
...,
[0. , 0. , 0. , ..., 0. , 0.1, 0. ],
[0. , 0. , 0. , ..., 0.9, 0. , 0.1],
[0. , 0. , 0. , ..., 0. , 0.9, 0. ]])
array([[0.88889, 0.09877, 0.01097, ..., 0. , 0. , 0. ],
[0.88889, 0.09877, 0.01097, ..., 0. , 0. , 0. ],
[0.88889, 0.09877, 0.01097, ..., 0. , 0. , 0. ],
...,
[0. , 0. , 0. , ..., 0. , 0. , 0. ],
[0. , 0. , 0. , ..., 0. , 0. , 0. ],
[0. , 0. , 0. , ..., 0. , 0. , 0. ]])
array([[0.88889, 0.09877, 0.01097, ..., 0. , 0. , 0. ],
[0.88889, 0.09877, 0.01097, ..., 0. , 0. , 0. ],
[0.88889, 0.09877, 0.01097, ..., 0. , 0. , 0. ],
...,
[0. , 0. , 0. , ..., 0. , 0. , 0. ],
[0. , 0. , 0. , ..., 0. , 0. , 0. ],
[0. , 0. , 0. , ..., 0. , 0. , 0. ]])
관찰결과
.- 따라서 상태0은 recurrent!
-
case3:
p=0.5
P1 = np.array([[i-j == 1 for i in range(1000)] for j in range(1000)])*p
P2 = np.array([[j-i == 1 for i in range(1000)] for j in range(1000)])*(1-p)
P = P1+P2
P[0,0]= 1-p
P
array([[0.5, 0.5, 0. , ..., 0. , 0. , 0. ],
[0.5, 0. , 0.5, ..., 0. , 0. , 0. ],
[0. , 0.5, 0. , ..., 0. , 0. , 0. ],
...,
[0. , 0. , 0. , ..., 0. , 0.5, 0. ],
[0. , 0. , 0. , ..., 0.5, 0. , 0.5],
[0. , 0. , 0. , ..., 0. , 0.5, 0. ]])
array([[0.025, 0.025, 0.025, ..., 0. , 0. , 0. ],
[0.025, 0.025, 0.025, ..., 0. , 0. , 0. ],
[0.025, 0.025, 0.025, ..., 0. , 0. , 0. ],
...,
[0. , 0. , 0. , ..., 0. , 0. , 0. ],
[0. , 0. , 0. , ..., 0. , 0. , 0. ],
[0. , 0. , 0. , ..., 0. , 0. , 0. ]])
array([[0.003, 0.003, 0.003, ..., 0. , 0. , 0. ],
[0.003, 0.003, 0.003, ..., 0. , 0. , 0. ],
[0.003, 0.003, 0.003, ..., 0. , 0. , 0. ],
...,
[0. , 0. , 0. , ..., 0. , 0. , 0. ],
[0. , 0. , 0. , ..., 0. , 0. , 0. ],
[0. , 0. , 0. , ..., 0. , 0. , 0. ]])
array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]])
관찰결과
.- 그런데 엄청 천천히 0으로 수렴함.
이 0으로 수렴하는 속도가 매우 빠르다면 일 것이고 그렇지 않다면 일 것임.- 이 경우는 왠지
일 것 같음. - 그래서 상태 0은 recurrent 인 것 같음.
- 실제로 그런지 실험해볼까?
확인:
Pstar = P.copy()
pT = list()
pT.append(Pstar[0,0])
T = 10000
for t in range(T):
Pstar = Pstar@P
pT.append(Pstar[0,0])
np.array(pT).cumsum()
array([ 0.5 , 1. , 1.375 , ..., 157.58090143,
157.58888008, 157.59685793])
여기에서
pT
=np.array(pT).cumsum()
=
이다. 마지막의 np.array(pT).cumsum()
을 시각화하면 아래와 같다.
그래프를 보니 발산할 것 같음
-
결론: 계산해보면 (이론적으로든, 시뮬레이션을 이용하든) 이 예제의 경우 아래와 같이 됨을 알 수 있다.
- 경우1:
. // state 0 is transient - 경우2:
with , . // state 0 is positive recurrent - 경우3:
with . // state 0 is null recurrent
-
def calculate_pT(p):
P1 = np.array([[i-j == 1 for i in range(1000)] for j in range(1000)])*p
P2 = np.array([[j-i == 1 for i in range(1000)] for j in range(1000)])*(1-p)
P = P1+P2
P[0,0]= 1-p
Pstar = P.copy()
pT = list()
pT.append(Pstar[0,0])
for t in range(1000):
Pstar = Pstar@P
pT.append(Pstar[0,0])
return np.array(pT)
fig = plt.figure(figsize=(8,6))
plt.plot(case1.cumsum(),label=r'$p=0.55$ $\Rightarrow$ transient', color='C0')
plt.plot(case2.cumsum(),label=r'$p=0.45$ $\Rightarrow$ positive recurrent', color='C1')
plt.plot(case3.cumsum(),label=r'$p=0.50$ $\Rightarrow$ null recurrent', color='C2')
plt.title('reflecting random walk with $p$',size=15)
plt.legend()
<matplotlib.legend.Legend at 0x7fa316ab5e50>